import requests
from bs4 import BeautifulSoup

import pandas as pd
import time
import pymysql

# 读取Excel文件
# file_path = 'C:\\Users\\83451\\Desktop\\检测院招标公告10.19-10.23.xlsx'  # Excel文件路径
file_path = 'C:\\Users\\83451\\Desktop\\11.xlsx'
sheet_name = '10.23'  # 工作表名称
column_name = '链接'  # 列名

# 读取指定工作表和列的数据
df = pd.read_excel(file_path, sheet_name=sheet_name, engine='openpyxl', usecols=[column_name])

# 提取列数据并转换为列表
column_data = df[column_name].tolist()
# print(column_data)

from pydantic import BaseModel, Field
from typing import List
from langchain.output_parsers import PydanticOutputParser

conn = pymysql.connect(host='192.168.110.235', port=8306, user='root', password='jsti@2024', db='bid')


class BidDataSource(BaseModel):
    projectName: str = Field(description="项目名称")
    company: str = Field(description="所属单位")
    bidingAgency: str = Field(description="招标代理机构")
    area: str = Field(description="所属省份")
    city: str = Field(description="所属城市")
    industry: str = Field(description="所属行业")
    expirationDate: str = Field(description="截止日期")
    declarationDate: str = Field(description="公告日期")
    procurementMethod: object = Field(description="采购方式")
    budget: object = Field(description="预算金额")
    supplierQualification: object = Field(description="供应商资质要求")
    bidderQualification: object = Field(description="投标人特定资格条件")
    agentServiceFee: object = Field(description="代理服务费")
    contactInfo: object = Field(description="联系方式")


parser = PydanticOutputParser(pydantic_object=BidDataSource)

# 导入LangChain中的提示模板
from langchain import PromptTemplate

# # 创建原始模板
# template = """根据输入信息提炼出来以下内容，以json的格式返回结果。信息包括:项目名称、所属单位、所属地区、截止日期、公告日期、采购方式、预算金额、供应商资质要求、投标人特定资格条件、联系方式、代理服务费
#  """
template = """ """
# # 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# # 打印LangChain提示模板的内容
# print(prompt)

# 设置OpenAI API Key
import os
import json

os.environ["OPENAI_API_KEY"] = 'sess-AhB1ASUOJlQ82bnJQvTlNlBkl0lOCLVS9wIRfBVk'
# 导入LangChain中的OpenAI模型接口
from langchain import OpenAI
from langchain.output_parsers import OutputFixingParser
from datetime import datetime
import re


def is_valid_chinese_date_format(date_string):
    # 定义匹配中文年月日格式的正则表达式
    pattern = r'^\d{4}年\d{1,2}月\d{1,2}日$'
    pattern1 = r'^\d{4}-\d{1,2}-\d{1,2}$'

    # 使用正则表达式进行匹配
    if re.match(pattern, date_string):
        return True
    elif re.match(pattern1, date_string):
        return True
    else:
        return False


# 创建模型实例
model = OpenAI(model_name='gpt-3.5-turbo-16k')
new_parser = OutputFixingParser.from_llm(parser=parser, llm=model)
cursor = conn.cursor()
current_time = datetime.now()

# 目标网址
for url in column_data:
    time.sleep(28)
    # 发送请求并获取网页内容
    response = requests.get(url)
    html_content = response.text

    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(html_content, 'html.parser')
    # 提取所有文本节点
    text_nodes = soup.find_all(string=True)
    # 过滤掉HTML标签
    filtered_text = ''.join(
        [node.strip() for node in text_nodes if node.parent.name not in ['style', 'script', 'head', 'title']])
    end_text = (
        "根据以上信息提炼出来以下内容，以中文json的格式返回结果，结果中不包含英文。信息包括:项目名称(仅提取项目名即可)、所属单位、所属行业(从项目名称进行判断对行业进行归类，匹配相近的行业分类如市政、公路、水运、水利、铁路、城轨、航空、建工、环境、食品，如果都匹配不上归类为其他)、招标代理机构、"
        "所属省份（补全省份或直辖市名称，示例：湖北=湖北省、北京=北京市）、所属城市（补全城市名称，示例：武汉=武汉市）、截止日期（时间格式为年月日）、公告日期（时间格式为年月日）、采购方式、预算金额(换算成万元单位必须为万元，存在多个金额累加后保留小数点后2位输出。示例：￥9,230,000.00元 = 923万元)、"
        "供应商资质要求(输出必须为字符串)、投标人特定资格条件(输出必须为字符串)、招标人/采购人联系电话、代理服务费(单位必须是万元，只输出金额，若不存在输出为暂无)。")
    # 获取模型的输出
    result = filtered_text + end_text
    start_time = time.time()
    output = model(result)
    end_time = time.time()
    o = new_parser.parse(output)
    Get_Standard_Json = json.loads(o.json())
    data = json.dumps(Get_Standard_Json, ensure_ascii=False, separators=(',', ':'))
    print(data)
    print("模型响应时间：", end_time - start_time, "秒")
    parsed_data = json.loads(data)
    expirationDate = str(parsed_data["expirationDate"])
    declarationDate = str(parsed_data["declarationDate"])
    if is_valid_chinese_date_format(expirationDate):
        if '-' in expirationDate:
            expiration = datetime.strptime(parsed_data["expirationDate"], "%Y-%m-%d")
        else:
            expiration = datetime.strptime(parsed_data["expirationDate"], "%Y年%m月%d日")
    else:
        expiration = current_time
    if is_valid_chinese_date_format(declarationDate):
        if '-' in declarationDate:
            declaration = datetime.strptime(parsed_data["declarationDate"], "%Y-%m-%d")
        else:
            declaration = datetime.strptime(parsed_data["declarationDate"], "%Y年%m月%d日")
    else:
        declaration = current_time

    data = [
        (parsed_data["projectName"], parsed_data["company"], parsed_data["area"], expiration, declaration,
         parsed_data["procurementMethod"], parsed_data["budget"], parsed_data["supplierQualification"],
         parsed_data["bidderQualification"], parsed_data["contactInfo"], parsed_data["agentServiceFee"],
         parsed_data["industry"], url, parsed_data["city"], parsed_data["bidingAgency"])
    ]

    sql = "INSERT INTO bid_source_data (`project_name`, `company`, `area`, `expiration_date`, `declaration_date`, `procurement_method`, `budget`, `supplier_qualification`, `bidder_qualification`, `contact_info`, `agent_service_fee`, `industry`,`content`,`city`,`biding_agency`) VALUES (%s, %s,%s, %s,%s, %s,%s, %s,%s, %s,%s,%s,%s,%s,%s)"
    # 执行批量插入
    cursor.executemany(sql, data)
    print("插入成功")
    # 提交事务
    conn.commit()
    # 关闭连接
cursor.close()
conn.close()
